注意:所有文章除特别说明外,转载请注明出处.
简介
该模式是用于表示具有层次结构的数据,使得我们对单个对象和组合对象的访问具有一致性。将一组相似的对象当作一个单一的对象。此模式创建了一个包含自己对象组的类。将对象组合成树形结构表示“部分-整体”的层次结构。
组合模式使得客户端对单个对象和组合对象保持一致的方式处理。
场景
1. 希望客户端可以忽略组合对象与单个对象的差异时
2. 处理一个树形结构时
优点
1. 清楚定义分层次的复杂对象,表示对象的全部或部分层次
2. 让客户端忽略层次的差异,方便对整个层次结构进行控制
3. 简化客户端程序
缺点
1. 限制类型时会比较复杂
2. 设计变得更加抽象
相关设计模式
1. 组合模式与访问者模式
组合模式的具体实现
1.创建 Employee 类 该类带有 Employee 对象的列表
import java.util.ArrayList;
import java.util.List;
public class Employee {
private String name;
private String dept;
private int salary;
private List<Employee> subordinates;
//构造函数
public Employee(String name,String dept, int sal) {
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new ArrayList<Employee>();
}
public void add(Employee e) {
subordinates.add(e);
}
public void remove(Employee e) {
subordinates.remove(e);
}
public List<Employee> getSubordinates(){
return subordinates;
}
public String toString(){
return ("Employee :[ Name : "+ name
+", dept : "+ dept + ", salary :"
+ salary+" ]");
}
}
2.使用 Employee 类来创建和打印员工的层次结构
public class CompositePatternDemo {
public static void main(String[] args) {
Employee CEO = new Employee("John","CEO", 30000);
Employee headSales = new Employee("Robert","Head Sales", 20000);
Employee headMarketing = new Employee("Michel","Head Marketing", 20000);
Employee clerk1 = new Employee("Laura","Marketing", 10000);
Employee clerk2 = new Employee("Bob","Marketing", 10000);
Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
Employee salesExecutive2 = new Employee("Rob","Sales", 10000);
CEO.add(headSales);
CEO.add(headMarketing);
headSales.add(salesExecutive1);
headSales.add(salesExecutive2);
headMarketing.add(clerk1);
headMarketing.add(clerk2);
//打印该组织的所有员工
System.out.println(CEO);
for (Employee headEmployee : CEO.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}
}
}
总结
组合模式,表一个对象中包含其它对象,这些被包含的对象可能是终点对象,也可能不是终点对象。作为具有容器特征的对象,不经包含对象本身的属性,还包括其它对象。
源码
1. java.awt.container
2. java.util.HashMap